vfs: check userland buffers before reading them.
[haiku.git] / docs / develop / input / intro to input_server
blobc2fbce5a43d77e2623a66ad93be6c329f8434617
1 <BASE HREF="http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html"><table border=1 width=100%><tr><td><table border=1 bgcolor=#ffffff cellpadding=10 cellspacing=0 width=100% color=#ffffff><tr><td><font face=arial,sans-serif color=black size=-1>This is <b><font color=#0039b6>G</font> <font color=#c41200>o</font> <font color=#f3c518>o</font> <font color=#0039b6>g</font> <font color=#30a72f>l</font> <font color=#c41200>e</font></b>'s <a href="http://www.google.com/help/features.html#cached"><font color=blue>cache</font></a> of <A HREF="http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html"><font color=blue>http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html</font></a>.<br>
2 <b><font color=#0039b6>G</font> <font color=#c41200>o</font> <font color=#f3c518>o</font> <font color=#0039b6>g</font> <font color=#30a72f>l</font> <font color=#c41200>e</font></b>'s cache is the snapshot that we took of the page as we crawled the web.<br>
3 The page may have changed since that time.  Click here for the <A HREF="http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html"><font color=blue>current page</font></a> without highlighting.</font><br><br><center><font size=-2><i>Google is not affiliated with the authors of this page nor responsible for its content.</i></font></center></td></tr>
4 <tr><td>
5 <table border=0 cellpadding=0 cellspacing=0><tr><td><font face=arial,sans-serif color=black size=-1>These search terms have been highlighted:&nbsp;</font></td><td bgcolor=#ffff66><B><font face=arial,sans-serif color=black size=-1>hiroshi&nbsp;</font></B></td><td bgcolor=#A0FFFF><B><font face=arial,sans-serif color=black size=-1>lockheimer&nbsp;</font></B></td></tr></table>
6 <font face=arial,sans-serif color=black size=-1>These terms only appear in links pointing to this page: <B>input_server </B></font>
7 </td></tr></table></td></tr></table>
8 <hr>
9 <HTML>
10 <HEAD><TITLE>Be Newsletter, Volume II, Issue 35</TITLE></HEAD>
11 <BODY BGCOLOR="#FFFFFF">
13 <HR><Center><B>Be Newsletter, Volume II, Issue 35;  September 2, 1998</B></CENTER><HR>
14             
15       
16 <FONT SIZE=+1><B><A NAME="Insight"></A>BE ENGINEERING INSIGHTS: <p>An Introduction to the Input Server</B></FONT>
17 <br><B>By <B style="color:black;background-color:#ffff66">Hiroshi </B><B style="color:black;background-color:#A0FFFF">Lockheimer</B> <A HREF="mailto:hiroshi@be.com"><B style="color:black;background-color:#ffff66">hiroshi</B>@be.com</A></B>
18 <P>One of the many upcoming changes in the BeOS is in the world
19 of input devices and events. The Input Server, slated to
20 debut in R4, is a server that deals with all things &quot;input.&quot;
21 Specifically, it serves three functions: manages input
22 devices such as keyboards and mice; hosts a stream of events
23 that those devices generate; and dispatches those events
24 that make it through the stream.
27 <P>
28 <b>Managing Input Devices</b>
31 <P>The Input Server is a pretty dumb piece of software. (Cue to
32 Alex: roll your eyes and say, &quot;What do you expect <B style="color:black;background-color:#ffff66">Hiroshi</B>,
33 you wrote it.&quot;) On its own, the server doesn't know how a
34 keyboard or a mouse works; it relies on <CODE>BInputServerDevice</CODE>
35 add-ons to tell it.
38 <P><CODE>BInputServerDevice</CODE> is a base class from which all input
39 device add-ons must derive. It provides the basic framework
40 of virtual hook functions and non-virtual member functions
41 that the Input Server uses to communicate with an add-on,
42 and that the add-on can use to talk back to the server. To
43 give a sneak peak of the API, some of the virtuals include
44 <CODE>InitCheck()</CODE>, <CODE>Start()</CODE>, <CODE>Stop()</CODE>, and <CODE>Control()</CODE>. The common
45 sequence of the life of an input device is this:
47 <ol>
49 <li> The Input Server loads an add-on and constructs its
50    <CODE><CODE>BInputServerDevice</CODE></CODE>-derived object.
53 <P><li> The Input Server calls <CODE>InitCheck()</CODE> on the object. The
54    object determines whether it is capable of doing its job
55    -- that is, generating input events.
58 <P><li>  This task may involve the object sniffing around for
59    hardware it can drive, or looking for a kernel device
60    driver in <CODE>/dev</CODE>. If the object is happy, it registers with
61    the Input Server any input device(s) it finds, and
62    returns <CODE>B_NO_ERROR</CODE>. An error return causes the Input
63    Server to promptly destruct the object and unload the
64    add-on.
67 <P><li> At some point in time, someone will tell the input
68    devices registered with the Input Server to <CODE>Start()</CODE>. The
69    system automatically starts keyboards and mice at boot
70    time. Any other type of device (an &quot;undefined&quot; input
71    device that the system doesn't have any special knowledge
72    about) can be started by an application using new API in
73    the Interface Kit.
76 <P><li> A registered device, whether it has been started or
77    not, may be <CODE>Control()</CODE>-ed at any time. Think of Control()
78    as the <CODE>ioctl()</CODE> equivalent in input device parlance.
79    Examples of system-defined control messages include
80    keymap changes and mouse speed changes.
81 </ol>
83 <P>
84 <b>Generating Input Events</b>
87 <P>Once a <CODE>BInputServerDevice</CODE>-derived object's input device is
88 up and running, its primary task is to generate input
89 events. These events are expressed as BMessages. For
90 example, a keyboard input device will most likely generate
91 <CODE>B_KEY_DOWN</CODE> and <CODE>B_KEY_UP</CODE> messages. Similarly, a mouse input
92 device will probably generate <CODE>B_MOUSE_UP</CODE>, <CODE>B_MOUSE_DOWN</CODE>, and
93 <CODE>B_MOUSE_MOVED</CODE> events.
96 <P>There is nothing that prevents an input device from putting
97 arbitrary data in any of the <CODE>BMessages</CODE> it generates. So, for
98 example, a tablet may generate the aforementioned mouse
99 events with extra data such as pressure and proximity. Any
100 information packed into the <CODE>BMessages</CODE> is delivered
101 unmolested by the input server.
104 <P>When an event is ready to be shipped off, an input device
105 enqueues it into the Input Server's event stream. Some
106 <CODE>BHandler</CODE> (most likely a <CODE>BView</CODE>) down the line eventually
107 receives the event by way of the usual hook functions such
108 as <CODE>KeyDown()</CODE>, <CODE>MouseDown()</CODE>, and <CODE>MouseMoved()</CODE>.
112 <b>The Input Event Stream</b>
115 <P>The Input Server's event stream is open for inspection and
116 alteration by anyone in the system. This is achieved through
117 another set of add-ons called <CODE>BInputServerFilter</CODE>. Like
118 <CODE>BInputServerDevice</CODE>, <CODE>BInputServerFilter</CODE> is a base class for input filter add-ons to the Input Server.
121 <P>An input filter add-on is privy to all the events that pass
122 through the Input Server's event stream. A filter may
123 inspect, alter, generate, or completely drop input events.
124 It's similar in some ways to the Interface Kit's
125 <CODE>BMessageFilter</CODE>, but much more low-level. A
126 <CODE>BInputServerFilter</CODE> sees all events that exist in the system;
127 <CODE>BMessageFilters</CODE> are associated with a specific <CODE>BLooper</CODE> and
128 thus see only the events targeted to its <CODE>BLooper</CODE>. Also,
129 filters in the Input Server can generate additional events
130 in place of, or in addition to, the original input event
131 that it was invoked with.
135 <b>Conclusion</b>
138 <P>With the introduction of loadable input device objects, the
139 Input Server enables the BeOS to be used with a wide variety
140 of input devices (and more than one of them at once too).
141 And with the advent of input filters, the Input Server opens
142 the door to a new class of tricks, hacks, and (gulp) pranks
143 for the creative developer. It's going to be fun.
148 </BODY>
149 </HTML>